#ifndef OBJC_CODEGEN_H
#define OBJC_CODEGEN_H

#include <stdio.h>
#include <stdarg.h>
#include "context.h"

typedef struct objc_codegen *objc_codegen_t;

struct objc_codegen {
  char *path;
  FILE *fp;
  int indent_lv;
};

#define OBJC_LINE_MARK_BEGIN     0x01
#define OBJC_LINE_MARK_END       0x02
#define OBJC_LINE_MARK_SYSTEM    0x04
#define OBJC_LINE_MARK_SRC       0x08

objc_codegen_t objc_make_codegen(const char *);
void objc_free_codegen(objc_codegen_t);
void objc_codegen_close(objc_codegen_t);
void objc_codegen_indent(objc_codegen_t);
void objc_codegen_dedent(objc_codegen_t);
void objc_codegen_write(objc_codegen_t, const char *);
void objc_codegen_writef(objc_codegen_t, const char *, ...);
void objc_codegen_writeln(objc_codegen_t);
void objc_codegen_writelnf(objc_codegen_t, const char *, ...);
void objc_codegen_writelns(objc_codegen_t, int);
void objc_codegen_write_line_mark(objc_codegen_t, objc_line_mark_t);
void objc_codegen_write_indent(objc_codegen_t);
void objc_codegen_write_comment(objc_codegen_t, const char *, ...);
void objc_codegen_write_stmt(objc_codegen_t, const char *, ...);
void objc_codegen_write_gcc_attr(objc_codegen_t, const char *, ...);

#endif /* OBJC_CODEGEN_H */
